// 第3题：假设以带头结点的循环链表表示队列，
// 并且只设一个指针指向队尾元素结点（注意不设头指针），
// 试编写相应的初始化队列、入队列和出队列算法，并测试。
#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
typedef struct node{
    int data;
    node* next;
}node, *Que;
void init(Que& q) {
    q = (Que)malloc(sizeof(node));
    if (!q)
        exit(-2);
    q->next = q;
}
void enQue(Que& q, int e) {
    Que cur = (Que)malloc(sizeof(node));
    if (!cur)
        exit(-2);
    cur->data = e;
    cur->next = q->next;
    q->next = cur;
    q = cur;
}
void deQue(Que& q, int& e) {
    if (q->next == q)
        exit(-1);
    Que head = q->next;
    Que cur = head->next;
    e = cur->data;
    head->next = cur->next;
    if (cur == q)
        q = head;
    free(cur);
}
void show(Que q) {
    if (q == q->next) {
        printf("队列空\n");
        return;
    }
    printf("队头->队尾: ");
    Que cur = q->next->next;
    while (cur != q->next) {
        printf("%d ", cur->data);
        cur = cur->next;
    }
    printf("\n");
}
int main(void) {
    Que q;
    init(q);
    show(q);
    int e = 4;
    enQue(q, e);
    show(q);
    e = 5;
    enQue(q, e);
    show(q);
    deQue(q, e);
    printf("e = %d\n", e);
    show(q);

    return 0;
}